Computer Tyme BatZap * Copyright 1994 by Marc Perkel
All Rights Reserved * Version 1.03 * Release Date: 09-16-94

Computer Tyme * 411 North Sherman, Suite 300 * Springfield Mo. 65802
(417) 866-1222 Voice * (800) 548-5353 Sales * (417) 866-1665 Fax/BBS

* We're moving! - Starting 1995 - Computer Tyme, Fair Grove Mo. 65648

This utility is a script language for modifying batch files and other
configuration files in text format. Because it's a script language, it
is able to make precise changes and conditionally add or change lines
within a file based on a number of conditionals.

BatZap can also be used as a smart batch file switch program. It can
read system information and conditionally set environment variables and
dos errorlevel codes used by batch files. This allow batch file to
branch based on conditions controlled by BatZap.

 Usage: BATZAP <Script File>

 Example:
   BatZap AUTO.BZ   ;the BZ extension is assumed

Price $95 per Server.
Written in MarxMenu. Comes free with the Network Survival Kit.


 Example BatZap Script File:

 ReadFile 'C:\AUTOEXEC.BAT'
 SubSt 'C:\DOS' 'C:\NWDOS'
 if Find 'PATH='
    if not (ThisLine contains 'C:\NWDOS')
       ThisLine = ThisLine + 'C:\NWDOS;'
    endif
 endif
 WriteFile


Commands are interpreted left to right, so you may have to use parens in
order to control the order of execution.

 Example:
    3 + 4 * 2      ; returns 14
    3 + (4 * 2)    ; returns 11
    if InGroup(Accounting) and (DayOfWeek = 'FRI')


BATZAP VOCABULARY:
------------------

BatZap defines 26 variables, the letters A to Z. These variables can be
used to store numbers, strings, or boolean values (True/False).


==> +

Adds two values.

 Example:
   Writeln 'A' + 'B'
   Writeln 3 + 5


==> -

Subtracts two values.

 Example:
   Writeln 5 - 3


==> *

Multiplies two values.

 Example:
   Writeln 6 * 3


==> /

Divides two values.

 Example:
   Writeln 6 / 3


==> =

Compares two values and returns true if they are equal.

 Example:
    if 2 + 2 = 4


==> <>

Compares two values and returns true if they are not equal.

 Example:
    if 2 + 2 <> 5


==> >

Compares two values and returns true if the first value is greater than the
second value.

 Example:
    if 'D' > 'C'


==> <

Compares two values and returns true if the first value is less than the
second value.

 Example:
    if 'C' < 'D'


==> >=

Compares two values and returns true if the first value is greater than or
equal to the second value.

 Example:
    if 'D' >= 'C'


==> <=

Compares two values and returns true if the first value is less than or
equal to the second value.

 Example:
    if 'C' <= 'D'


==> ( )

Parens begin and end logical grouping for interpretation.

 Example:
    if ('A' < 'B') and (9 > (5 + 3))


==> AddLine (String)

AddLine adds a line to the buffer just after the line number that
CurrentLine is set to. After a ReadFile, CurrentLine is set to the last
line in the file. If you set CurrentLine to 0, AddLine will add the line
to the beginning of the buffer.

 Example:
   CurrentLine = 1
   if not (ThisLine StartsWith '@ECHO')
      CurrentLine = 0
      AddLine '@Echo Off'
   endif


==> And

And returns the logical And of two values.

 Example:
   if InGroup 'EveryOne' and InGroup 'Accounting'


==> Char (Number) : String

Char returns the ascii character of the number passed.

 Example:
   Write Char(10)  ;writes a line feed


==> ConsoleOperator : Boolean

ConsoleOperator returns True if the user is a Novell console operator.

 Example:
   if ConsoleOperator
      ErrorLevel = 1
   endif


==> ChDir (Directory)

ChDir changes drives and directories.

 Example:
   ChDir 'F:\PUBLIC'


==> Contains

Contains returns True if the string on the left contains the string on
the right.

 Example:
   if ThisLine contains 'NWDOS'


==> CPU : Number

CPU returns the class of CPU chip you are running.

 Example:
    if CPU >= 3


==> CurrentDirectory : String

Returns the current directory.

 Example:
   Writeln CurrentDirectory    ;returns 'F:\NSK'


==> CurrentLine : Number

CurrentLine returns the line number for which other commands that use
CurrentLine act on. You can also set CurrentLine.

 Example:
   CurrentLine = CurrentLine - 1     ;go to previous line


==> DayOfWeek : String

DayOfWeek returns the first three letters of the day of the week.

 Example:
    if DayOfWeek = 'TUE'


==> DelBlock (Start,End)

DelBlock deletes all the lines from Start to End.

 Example:
   DelBlock 5 9


==> DelChar (String,Position,Count) : String

DelChar deletes Count characters from String at Position and returns the
result.

 Example:
    Writeln DelChar('12345',3,2)  ;returns '125'


==> DelLine (Line)

DelLine deletes the specified line. If Line isn't specified, the
CurrentLine is assumed.

 Example:
   DelLine 10


==> DeleteFile (Name)

DeleteFile deletes a file. It can also delete a read-only file.

 Example:
   DeleteFile 'AUTOEXEC.BAK'


==> DelSection (Name)

DelSection deletes a group of lines beginning with a line that contains
the string ('SECTION: ' + Name) and ending with the line that contains
the string ('ENDSECTION: ' + Name). If you put sections in your file
that are commented like in the following example, then DelSection will
allow you to take the whole section out in one command.

 Example:

   Your file contains:

   REM ---------[ Section: Network ]-----------

   LoadHi LSL
   LoadHi NE2000
   LoadHi IPXODI
   LoadHi NETX

   REM -------[ End Section: Network ]---------

   DelSection 'NETWORK'   ;removes the entire section


==> Display : String

Display returns the type of video card. Types returned are HERC, CGA,
EGA, VGA.

 Example:
    if Display = 'VGA'


==> DosVersion : Number

DosVersion returns a number that is 100 times the major dos version plus
the minor dos version. Note that this is the version returned by the API
interface which doesn't always match what the VER command returns.

 Example:
   Writeln DosVersion    ; under dos 3.3 will return 330


==> Else

See IF.


==> ElseIf

See IF.


==> EndIf

See IF.


==> EndLine : Number

EndLine returns the line number for which other commands that use
EndLine act on. You can also set EndLine. EndLine is used with StartLine
to specify a block of lines to be used by block commands line SubSt and
DelBlock.

 Example:
   StartLine = 4
   EndLine = 6
   SubSt 'OLD' 'NEW'


==> EndWhile

See While.


==> ErrorLevel : Number

When ErrorLevel is set to a value between 0 and 255, BatZap returns that
errorlevel to a batch file that is calling it.

 Example:
   ErrorLevel = 1

A batch file that tests if you are in a Novell group might look like
this:

 BatZap GrpTest
 if ErrorLevel 1 goto Yes
 ...
 ...
 :Yes

The GRPTEST.BZ file might look like this:

 if InGroup 'ACCOUNTING'
    ErrorLevel = 1
 endif


==> Execute (CommandLine)

Execute will execute a DOS command line. This can be used to create
directories and copy files.

 Example:
   if not ExistDir 'C:\NET'
      Execute 'MD C:\NET'
      Execute 'XCOPY Z:\LOCALDVR\*.* C:\NET /S'
   endif


==> Exit

Exit returns to DOS and exits the BatZap program.


==> False : Boolean

Returns the value False.

 Example:
   if A = False      ;same as: if not A


==> FileAttribute : Number

FileAttribute is a variable where BatZap stores the attributes of the
file read. (Hidden, System, and Read Only) These attributes are used to
set the attributes when the file is written. By setting this value you
can change the resulting attributes.

 Example:
   FileAttribute = 1   (read only)
   WriteFile


==> FileLog (FileName,String)

FileLog will write the line String to the end of file FileName. This
feature can be used to keep a log of updates made for later inspection.

 Example:
   FileLog('Z:AUTO.LOG',UserName + ' Updated!')


==> Find (String) : Boolean

Find searches the buffer for String and returns True if found. It also
sets CurrentLine to the line the string was found on.

 Example:
   if Find 'PATH='
      if not (ThisLine contains 'C:\NWDOS')
         ThisLine = ThisLine + 'C:\NWDOS;'
      endif
   endif


==> FindMode

FindMode controls the way that a string is found. FindMode is set to the
letters C,S, or M.

 C = Contains the string
 S = Starts with the string
 M = Matches the string

The default is mode C.

 Example:
   FindMode = 'S'


==> FindRange (StartString,EndString) : Boolean

FindRange is used to find a section of a file that starts with a line
containing StartString and ends with a line containing EndString. This
is useful for modifying NET.CFG files where you want to update one of the
link drivers.

FindRange returns True if it finds StartString. It also sets CurrentLine
to the line that StartString was found on and StartLine to the next
line. Then it searches for EndString. If it finds it then EndLine is set
to the line just before EndString. Otherwise, EndLine is set to the end
of the file. Thus, if found, the StartLine and EndLine settings are set
to search a block between two sections.

 Example:

   ReadFile 'NET.CFG'

   ;- find NE2000 section

   if FindRange('LINK DRIVER NE2000','LINK DRIVER')

      ;- Search for FRAME in NE2000 section

      if Find 'FRAME'
         ThisLine = '   FRAME Ethernet_802.2'
      else
         AddLine '   FRAME Ethernet_802.2'
      endif

   endif

   WriteFile


==> FullName : String

FullName returns the Novell full name in the network bindery for the
current user.

 Example:
   SetEnv('FULLNAME=' + FullName)


==> If (Condition)

If allows for conditionals in BatZap. If the condition is met, all lines
between If and Endif are executed. Otherwise, lines between Else and
Endif are executed.

 Example:
    if Condition
       ...
       ...
       if Condition
          ...
          ...
       endif
       ...
       ...
    elseif Condition
       ...
       ...
    elseif Condition
       ...
       ...
    else
       ...
       ...
    endif


==> InGroup (Group) : Boolean

InGroup returns True if user is in the Novell group.

 Example:
   if InGroup 'EveryOne'


==> InsChar (Ins,String,Position) : String

InsChar inserts string Ins into String at Position and returns the
resulting string.

 Example:
   Writeln InsChar('ABC','12345',3)  ;returns '12ABC345'


==> IsOlderThan

IsOlderThan is used to compare the dates of files, or the date of a file
to a time string.

 Example:
   if 'C:\NET.CFG' IsOlderThan 'P:\NET.CFG'
   if 'C:\CONFIG.SYS' IsOlderThan '09-01-94'


==> LastLine : Number

LastLine returns the line number of the last line in the buffer.

 Example:
   Writeln LastLine


==> Left (String,Count) : String

Left returns the left Count characters of String.

 Example:
   Writeln Left('ABCD',2)   ;returns 'AB'


==> LeftOfEqual (String) : String

LeftOfEqual returns that part of a string that is left of the equal
sign. The string includes the = itself.

 Example:
   Writeln LeftOfEqual('PATH=C:\DOS')  ;returns PATH=


==> Length (String) : Number

Length returns the length of a string.

 Example:
   Writeln Length 'ABC'   ;returns 3


==> LoggedIn : Boolean

Returns True if user is logged into a Novell network.


==> MathChip : Boolean

MathChip returns true if you have a math coprocessor.

 Example:
    if MathChip


==> Mid (String,Position,Count) : String

Mid returns a substring of String at Position for length Count.

 Example:
   Writeln Mid('12345',3,2)   ;returns '34'


==> MkDir (Name)

MkDir creates a directory.

 Example:
   MkDir 'C:\NET'


==> Month : String

Month returns the first three letters of the Month.

 Example:
    if Month = 'AUG'


==> NameOfFile : String

NameOfFile returns the name of the file that was read with ReadFile.


==> Not

Not returns the logical Not of a value.

 Example:
   if Not InGroup 'EveryOne'


==> NoBak

Normally BatZap makes a BAK file when it overwrites an existing file. If
you execute NoBak then the BAK file isn't created.


==> Now : Number

Now returns the current time.


==> Or

Or returns the logical Or of two values.

 Example:
   if InGroup 'EveryOne' or InGroup 'Accounting'


==> Ord (String) : Number

Ord returns the ascii value of a character.

 Example:
   Write Ord('A')   ;returns 65


==> Param (Number) : String

Param returns the command line parameter passed when BatZap is executed.
It allows you to pass command line parameters to the script logic.
Param(1) is the name of the script file itself.

 Example:
    You run: BatZap MOD.BZ C:\CONFIG.SYS
    ReadFile Param(2)   ;reads the file name you passed on command line


==> Pos (Search,String) : Number

Pos returns the position of string Search in String. If String doesn't
contain Search, Pos returns a 0.

 Example:
   Writeln Pos('BCD','ABCDE')  ;returns 2


==> ReadEnv (Environment String) : String

ReadEnv returns the value of an environment variable.

 Example:
   if ReadEnv 'ENHANCED' = 'Y'


==> ReadFile (FileName)

ReadFile reads a text file into the BatZap buffer for modification. The
size of the file is limited to the amount of memory available, but
generally is up around 250k. If the FileName is omitted, the command
line parameter after the script file name is assumed to be the file name
to read.

 Example:
    ReadFile 'C:\CONFIG.SYS'

If a second ReadFile is executed before a WriteFile, the new file is
inserted into the buffer at location CurrentLine. This allows you to
merge files into one file. A WriteFile clears the buffer and allows you
to start modifying a new file.

When the first file is read, CurrentLine is set to the last line of the
file, and the StartLine and EndLine pointers are set to the beginning
and end of the file. FileName and FileAttribute are set.

If a second file is merged, the CurrentLine pointer is set to the end of
the new lines and the StartLine and EndLine pointers are set to enclose
the new data. FileName and FileAttribute are not set.

BatZap supports having multiple ReadFile and WriteFile commands in the
same script. This allows you to write one script that modifies several
files.


==> Reboot

Reboots the computer. Sometimes after changing the CONFIG.SYS and
AUTOEXEC.BAT files you want to reboot the computer to make the changes
take effect.


==> RenameFile (OldName,NewName)

RenameFile renames file OldName to NewName.

 Example:
 RenameFile 'OLD' 'NEW'


==> Replace (Old,New)

Replace will find all occurrences of the string Old and replace it
with the string New on the current line only. Use Subst to do multiple
lines.

 Example:
   Replace 'F:\PUBLIC\' 'P:\'


==> Right (String,Count) : String

Right returns the right Count characters of String.

 Example:
   Writeln Right('ABCD',2)   ;returns 'CD'


==> RightOfEqual (String) : String

RightOfEqual returns that part of a string that is right of the equal
sign. The string does not include the = itself.

 Example:
   Writeln RightOfEqual('PATH=C:\DOS')  ;returns C:\DOS


==> RmDir (Name)

RmDir removes a directory.

 Example:
   RmDir 'C:\NET'


==> SecurityEqual (User or Group) : Boolean

SecurityEqual returns True if the user is security equivelent to user.
Novell networks only.

 Example:
   if SecurityEqual('SUPERVISOR')
      SetEnv('CMD=SUPER.BAT')
   endif


==> Server : String

Server returns the name of the default file server.

 Example:
   if Server = 'MARX'


==> SetEnv (String)

SetEnv sets an environment variable to a value. This can be used with
conditionals to control the execution of a batch file running BatZap.

 Example:
   if InGroup 'PAYROLL'
      SetEnv('CMD=PAYROLL.BAT')
   else
      SetEnv('CMD=USER.BAT')
   endif

A batch file calling this might look like this:

   BatZap FORK.BZ
   %CMD%

In the above example, the batch file will jump to one of two batch files
depending on BatZap setting an environment variable.


==> StartLine : Number

StartLine returns the line number for which other commands that use
StartLine act on. You can also set StartLine. StartLine is used with
EndLine to specify a block of lines to be used by block commands line
SubSt and DelBlock.

 Example:
   StartLine = 4
   EndLine = 6
   SubSt 'OLD' 'NEW'


==> StartsWith

StartsWith returns true if the string on the left starts with the string
on the right.

 Example:
   if ThisLine StartsWith 'REM'


==> Station : String

Station returns the workstation address on a Novell network.

 Example:
    if Station = '250:33333'


==> Str (Number) : String

Str returns the string of a given number.

 Example:
   Writeln Str(2 + 4)   ;returns '6'


==> Subst (Old,New)

Subst will find all occurrences of the string Old and replace it
with the string New. The range is from StartLine to EndLine which is
normally set to include the whole buffer. Use the Replace command if you
want to do the CurrentLine only.

 Example:
   Substitute 'F:\PUBLIC\' 'P:\'


==> Supervisor : Boolean

Returns True if user is equivelent to the Novell network supervisor.


==> ThisLine : String

ThisLine returns the contents of the line that CurrentLine is set to. It
can also be used to set the contents of the CurrentLine.

 Example:
   CurrentLine = 1
   if ThisLine StartsWith 'ECHO'
      ThisLine = '@' + ThisLine
   endif


==> TimeOf (File or String) : Number

TimeOf returns the time of a file or a string. The time is a number that
represents the number of seconds since 01-01-80.

 Example:
   if TimeOf 'C:\AUTOEXEC.BAT' > TimeOf '09-01-94 2:45pm'
      Exit
   endif

   if TimeOf 'C:\QEMM386.SYS' < TimeOf 'P:\QEMM\QEMM386.SYS'
      Execute 'XCOPY P:\QEMM\*.SYS C:\'
   endif

   if TimeOf 'C:\AUTOEXEC.BAT' < (Now - (3600 * 24 * 7)
      ;- Over a week old
   endif


==> True : Boolean

Returns the value True.

 Example:
   if A = True      ;same as: if A


==> UpperCase (String) : String

UpperCase returns the UpperCase of a string.

 Example:
    if UpperCase ReadEnv 'ENHANCED' = 'Y'


==> UserName : String

UserName returns the Novell login name of the user.

 Example:
    if UserName = 'Marc'


==> Value (String) : Number

Value turns String into a Number.

 Example:
   Writeln Value('23')   ;returns number 23


==> VlmLoaded : Boolean

VlmLoaded returns True if the VLM shell is loaded.


==> VinesLoaded  : Boolean

VlmLoaded returns True if the Banyan Vines shell is loaded.


==> While

While is a control conditional like If and Endif. While the condition is
true, the lines between while and endwhile are executed.

 Example:
   While Condition
      ...
      ...
      While Condition
         ...
         ...
      EndWhile
      ...
      ...
   EndWhile


==> WholeFile

WholeFile sets FirstLine and LastLine to the first and last lines of the
buffer.


==> WriteFile (FileName)

WriteFile writes the BatZap buffer to a text file and clears the buffer
for the loading of another file. A single BatZap script can modify many
text files. If the FileName is omitted the name of the file read is
assumed. If the file written is the same name as the file read, and the
original file was read only, then the modified file will also be read
only.

 Example:
    WriteFile 'C:\CONFIG.SYS'


==> Write (String)

Write writes a string on the screen without a CR.

 Example: Write 'Adding Network Section ... '


==> Writeln (String)

Writeln writes a string on the screen with a CR.

 Example: Writeln 'Adding Network Section ... '


==> Xor

Or returns the logical Xor of two values.

 Example:
   if InGroup 'EveryOne' xor InGroup 'Accounting'



COMMON EXAMPLE SCRIPTS:
-----------------------

Here are some examples of common modification scripts that you might
need to use.


Suppose we are changing our windows directory from C:\WIN to C:\WINDOWS.
Here is an example of how it might be done.

 ReadFile 'C:\AUTOEXEC.BAT'
 if Find 'PATH='
    Replace 'C:\WIN;' 'C:\WINDOWS;'
    WriteFile
 endif


Now we are updating our CONFIG.SYS files for the new version of QEMM
that we just upgraded to. Here's how it's done.

 ReadFile 'C:\CONFIG.SYS'
 if Find 'QEMM386.SYS'

    ;- Add the RAM switch if it isn't there

    if pos('RAM',ThisLine) = 0
       ThisLine = ThisLine + ' RAM'
    endif

    A = CurrentLine - 1
    if pos('DOS-UP.SYS',Line A) = 0

       ;- Add DosUp and DosData lines before and after Qemm line

       CurrentLine = A
       AddLine 'device=dos-up.sys'
       CurrentLine = CurrentLine + 1
       AddLine 'device=dosdata.sys'

       ;- Copy the files down to the local hard drive

       Execute 'COPY P:\QEMM\*.SYS C:\'
    endif

    WriteFile
 endif


BATZAP WITH OTHER PROGRAMS
--------------------------

BatZap can be combined with other Computer Tyme programs to increase
it's power. For example, if you want to update all batch files that
start with Echo Off to @Echo Off:

WHEREIS *.BAT|DOLIST BATZAP ECHO.BZ @L

Whereis scans the entire drive and pipes the list into DoList. DoList
executes BatZap for every line in the pipe substituting the filename for
@L in the command line.


ABOUT INI FILES
---------------

Yes, BatZap can do INI files, but I have a program called IniTyme and it
is written specifically for INI files. If you want to do INI files, get
IniTyme.


NEED MORE POWER?
----------------

You like BatZap, but you need more power. BatZap doesn't have all the
features you want? No Problem. The next step is to upgrade to MarxMenu,
the language that BatZap it written in. MarxMenu is the world's most
powerful script language and can give you the power you need to do
complex processing, or greater speed. Call us or download MarxMenu from
our BBS and take a look at it.


EARLY VERSION DISCLAIMER
------------------------

I tend to do fairly well on early versions of my software. However,
before you trash every autoexec.bat file on your network, I advise you
to try it on some test files first. That way you make sure you don't
overlook something.

I'm sure there are some bugs, and I know there are a lot of features you
will want added. So feel free to call and let me know what you want.

My Compuserve support forum is NVENA Lib 3. The latest versions can be
downloaded from my BBS at 417-866-1665. You can also fax purchase orders
to the same number. <grin>
